﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ddcCajamarca.BusinessEntities.AgendaCultural;
using System.Data.Entity;
using ddcCajamarca.Repository.AgendaCultural.Service;
//
using System.Data.Entity.Validation;

namespace ddcCajamarca.Repository.AgendaCultural
{
    public class EventoRepository : MasterRepository, IEventoRepository
    {
        public List<Evento> GetAllEventos()
        {
            var query = from e in Context.Eventos
                        .Include("Ambiente")
                        .Include("TipoEvento")
                        orderby e.FechaInicio descending
                        select e;
            return query.ToList();
        }

        public List<Evento> GetAllEventosByCriterioAndFechas(string criterio, int? idAmbiente , DateTime? fechInicio, DateTime? fechFin)
        {
            #region Primero
            //obtengo todos los eventos
            var query = from p in Context.Eventos
                        .Include("Ambiente")
                        .Include("TipoEvento")
                        orderby p.FechaInicio descending
                        select p;

            //filtro por nombre
            if (!string.IsNullOrEmpty(criterio))
            {
                query = from p in query
                        where p.NombreEvento.ToUpper().Contains(criterio.ToUpper())
                        orderby p.FechaInicio descending
                        select p;
            }

            //filtro por rango de fechas ingresado
            if (fechInicio.HasValue && fechFin.HasValue)
            {
                fechInicio = DateTime.Parse(fechInicio.Value.ToShortDateString() + " 00:00:00");
                fechFin = DateTime.Parse(fechFin.Value.ToShortDateString() + " 23:59:59");

                query = from p in query
                        where p.FechaInicio >= fechInicio && p.FechaFin <= fechFin
                        orderby p.FechaInicio descending
                        select p;
            }
            #endregion

            if (idAmbiente >= 1)
            {

                if (fechInicio.HasValue && fechFin.HasValue)
                {

                    fechInicio = DateTime.Parse(fechInicio.Value.ToShortDateString() + " 00:00:00");
                    fechFin = DateTime.Parse(fechFin.Value.ToShortDateString() + " 23:59:59");

                    query = from p in query
                            where p.FechaInicio >= fechInicio && p.FechaFin <= fechFin && p.AmbienteId == idAmbiente
                            orderby p.FechaInicio descending
                            select p;
                }

                query = from p in query
                        where p.AmbienteId == idAmbiente
                        orderby p.FechaInicio descending
                        select p;

            }

            return query.ToList();
        }

        public Evento GetEventoById(int id)
        {
            var query = from e in Context.Eventos
                            .Include("Ambiente")
                            .Include("TipoEvento")
                            .Include("DetalleEventoes.Organizacion")
                        where e.Id.Equals(id)
                        select e;

            return query.SingleOrDefault();
        }

        //Para obtener el evento y poder agregarle las actividades
        public Evento GetEvento(int id)
        {
            return Context.Eventos.Find(id);
        }

        public void AddEvento(Evento evento)
        {
            evento.DetalleEventoes.ForEach(i => Context.Entry(i.Organizacion).State = EntityState.Unchanged);

            Context.Eventos.Add(evento);
            Context.SaveChanges();
        }

        public void UpdateEvento(Evento evento)
        {
            var eventoDB = GetEventoById(evento.Id);

            eventoDB.NombreEvento = evento.NombreEvento;
            eventoDB.Sintesis = evento.Sintesis;
            eventoDB.Descripcion = evento.Descripcion;
            eventoDB.Imagen = evento.Imagen;
            eventoDB.FechaInicio = evento.FechaInicio;
            eventoDB.FechaFin = evento.FechaFin;
            eventoDB.HoraInicio = evento.HoraInicio;
            eventoDB.HoraFin = evento.HoraFin;
            eventoDB.Modalidad = evento.Modalidad;
            eventoDB.Precio = evento.Precio;
            eventoDB.AmbienteId = evento.AmbienteId;
            eventoDB.TipoEventoId = evento.TipoEventoId;

            var nuevos = evento.DetalleEventoes.Except(eventoDB.DetalleEventoes).ToList();
            var eliminados = eventoDB.DetalleEventoes.Except(evento.DetalleEventoes).ToList();
            var modificados = evento.DetalleEventoes.Intersect(eventoDB.DetalleEventoes).ToList();

            eliminados.ForEach(e => eventoDB.DetalleEventoes.Remove(e));

            nuevos.ForEach(n =>
            {
                Context.Entry(n.Organizacion).State = EntityState.Unchanged;
                eventoDB.DetalleEventoes.Add(n);
            });

            foreach (var item in modificados)
            {
                var itemDb = eventoDB.DetalleEventoes.SingleOrDefault(i => i.OrganizacionId.Equals(item.OrganizacionId));

                itemDb.Aporte = item.Aporte;
                itemDb.Otros = item.Otros;
                itemDb.Tipo = item.Tipo;

                Context.Entry(itemDb).State = EntityState.Modified;
                Context.Entry(itemDb.Organizacion).State = EntityState.Unchanged;

            }

            Context.Entry(eventoDB).State = EntityState.Modified;

            Context.SaveChanges();

        }

        public void DeleteEvento(int id)
        {
            var evento = GetEventoById(id);

            Context.Eventos.Remove(evento);
            Context.SaveChanges();
        }

    }
}
